/*
 *  NetTalkClientMap.h
 *  NetTalk
 *
 *  Created by Andrey on 09/10/2008.
 *  Copyright 2008 ИУ7-2003. All rights reserved.
 *
 */

/** \file NetTalkClientMap.h
	\brief Файл содержит описания функций и структур данных, необходимых для
	работы с отображением IP-адресов в структуры NTClientInfo (информации о
	клиентах, используемой библиотекой NetTalk).
 */

// libevent support
#include <event.h>
#include "DataBuffer.h"
#include "BsdSocketAbstractionLayer.h"

/*
#define BOOL	int
#define	YES		1
#define	NO		0
*/
/*
Replaced with DataBuffer
 
typedef struct {
	BytePtr data;
	int totalLength;
	int currentOffset;
	TAILQ_ENTRY(NTWriteBuffer) bufferQueueEntries;
} NTWriteBuffer, *NTWriteBufferPtr;
*/

/**	\struct NTClientInfo
	\brief Структура, хранящая информацию о клиенте, которая используется 
	библиотекой NetTalk 
 */
BEGIN_STRUCT_DECLARATION(NTClientInfo)
	NTPeerInfoPtr peerInfo;
	//!< Указатель на структуру NTPeerInfo, содержащую низкоуровневую информацию о клиенте
	struct event dataReceivedEvent;
	//!< Событие, происходящее при получении данных на сокете 
	struct event readyToWriteEvent;
	//!< Событие, происходящее при готовности сокета к отправке данных (не используется) 
	TAILQ_HEAD(, _DataBuffer) writeBufferQueue;
	//!< Поле, необходимое для организации списков, элементами которых являются структуры NTClientInfo 
END_STRUCT_DECLARATION(NTClientInfo)

/**	\fn void InitClientMap();
	\brief Функция, инициализирующая отображение IP-адресов клиентов в структуры
	NTClientInfo
	\param Нет
	\return Ничего
 */
void InitClientMap();
/**	\fn void AddClientToMap(AsciiStringPtr clientAddress, NTClientInfoPtr clientInfo);
	\brief Функция, служащая для добавления нового элемента в отображение (а
	именно -- новой пары {IP-адрес клиента, Указатель на структуру NTClientInfo})
	\param AsciiStringPtr clientAddress -- строка, содержащая IP-адрес клиента
	\param NTClientInfoPtr clientInfo -- указатель на структуру NTClientInfo, 
	содержащую информацию об этом клиенте
	\return Ничего
 */
void AddClientToMap(AsciiStringPtr clientAddress, NTClientInfoPtr clientInfo);
/**	\fn NTClientInfoPtr	GetNTClientInfoByAddress(AsciiStringPtr clientAddress);
	\brief Функция, получающая указатель на структуру NTClientInfo по IP-адресу 
	клиента.
	\param AsciiStringPtr clientAddress -- строка с IP-адресом клиента
	\return Указатель на структуру NTClientInfo с информацией об указанном 
	клиенте.
 */
NTClientInfoPtr	GetNTClientInfoByAddress(AsciiStringPtr clientAddress);
/**	\fn void RemoveClientFromMap(AsciiStringPtr clientAddress);
	\brief Функция, предназначенная для удаления элемента отображения.
	\param AsciiStringPtr clientAddress -- строка с IP-адресом клиента, 
	информацию о котором необходимо удалить из отображения.
	\return Ничего
 */
void RemoveClientFromMap(AsciiStringPtr clientAddress);
/**	\fn void PurgeClientMap();
	\brief Функция, удаляющая из отображения все элементы.
	\param Нет
	\return Ничего
 */
void PurgeClientMap();